#include "Common.hpp"

int main()
{
    // 管道
    FIFO fifo;

    // 创建共享内存
    int shmid=GetShm();
    std::cout<<"create shm done,shmid="<<shmid<<std::endl;

    // 挂载共享内存
    char* shm_addr=(char*)shmat(shmid,nullptr,0);
    printf("attach shm,shm_addr=0x%p\n",shm_addr);
    
    int fd=open(FIFO_FILE,O_RDONLY);

    struct shmid_ds shmds;
    // 读写共享内存
    while(1)
    {
        // int n=Read_begin(fd);
        // if(n<0) 
        // {
        //     perror("ProcessA read error");
        // }
        // else if(n==0) break;
       // if(strcmp(shm_addr,"exit")==0) break;  // 这里判不判断都可以，因为共享内存中存放的是字符串，字符串的末尾会有\0，所以可以直接用strcmp判断是否相等
        std::cout<<"ProcessB:"<<shm_addr<<std::endl;  // 直接通过地址访问共享内存即可

       // shmctl(shmid,IPC_STAT,&shmds);
        // std::cout<<"shm size:"<<shmds.shm_segsz<<std::endl;
        // std::cout<<"shm nattach:"<<shmds.shm_nattch<<std::endl;
        // printf("shm_key:0x%x\n",shmds.shm_perm.__key);
        // std::cout<<"shm_mode:"<<shmds.shm_perm.mode<<std::endl;        

    }
    //解除共享内存挂载
    shmdt(shm_addr);
    printf("detach shm,shm_addr=0x%p\n",shm_addr);
    sleep(5);

    // 移除共享内存
    shmctl(shmid,IPC_RMID,nullptr);
    printf("remove shm,shm_addr=0x%p\n",shm_addr);
    
    return 0;

}
